package com.frank.code_notes.C01_array;

import cn.hutool.core.lang.Console;
import cn.hutool.core.util.StrUtil;
import com.frank.utils.L027Function;
import org.springframework.util.Assert;

import static java.util.Arrays.sort;

/**
 * @Description 27. 移除元素
 * @Author zhoujr
 * @Data 2024/11/21 15:54
 */
public class L027RemoveElement {

    /**
     * @Description 常规暴力解法，双for循环
     */
    public static int removeElement(int[] nums, int val) {
        int size = nums.length;
        for (int i = 0; i < size; i++) {
            if (nums[i] == val) {
                for (int j = i + 1; j < size; j++) {
                    nums[j - 1] = nums[j];
                }
                i--;
                size--;
            }
        }
        return size;
    }

    /**
     * @Description 使用快慢指针的方法实现
     */
    public static int removeElementTwo(int[] nums, int val) {
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
            if (nums[fastIndex] != val) {
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        return slowIndex;
    }

    public static void verify(int[] nums, int val, int[] exp, L027Function<Integer> l027Function) {
        // 它以不等于 val 的值排序。
        Integer k = l027Function.call(nums, val); // 调用你的实现
        Assert.isTrue(k == exp.length, "返回不同");
        sort(nums, 0, k); // 排序 nums 的前 k 个元素
        for (int i = 0; i < exp.length; i++) {
            Assert.isTrue( nums[i] == exp[i], "数组不同");
        }
        Console.log(k);
        Console.log(nums);
    }

    public static void main(String[] args) {
        verify(new int[]{3,2,2,3}, 3, new int[]{2,2}, L027RemoveElement::removeElement);
        verify(new int[]{3,2,2,3}, 3, new int[]{2,2}, L027RemoveElement::removeElementTwo);
    }

}
